package cn.uyunsky.platform.service;

import cn.uyunsky.platform.BeanFactoryUtil;
import cn.uyunsky.platform.data.UDataTool;
import cn.uyunsky.platform.data.UData;
import cn.uyunsky.platform.exception.PLException;
import cn.uyunsky.platform.util.PL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <p>Description: 实现服务的执行;包括对事物的管理.<br>
 * 其他控制类执行服务统一调用此接口实现<br>
 * </p>
 *
 * @author baiyh
 * @version 1.0
 */
public class ServiceExecuteImpl implements ServiceExecute {

    public static Logger log = LoggerFactory.getLogger(ServiceExecuteImpl.class);

    public UData execute(String service, UData data) {
        String seqno = PL.uuid();
        data.getHead().setSeqno(seqno);
        //TODO 同理将其他值也放置到相应head中

        if (log.isErrorEnabled()) {
            log.error("开始执行服务[" + service + "],请求数据为:\n" + data);
        }
        IService iservice = (IService) BeanFactoryUtil.getBean(service);
        try {
            //执行服务
            UData serRes = iservice.doService(data);
            serRes.getHead().setSeqno(seqno);

            //最终error级别看不到info输出
            if (log.isInfoEnabled()) {
                log.info("服务[" + service + "]执行成功,响应数据为:\n" + serRes);
            }

            if (log.isErrorEnabled()) {
                log.error("服务[" + service + "]执行成功");
            }
            return serRes;
        } catch (PLException e) {
            log.error("服务[" + service + "]执行出现逻辑错误,错误码:" + e.getKey(), e);
            return UDataTool.createResult(false, e.getKey(), e.getMessage());
        } catch (Exception e) {
            log.error("服务[" + service + "]执行出现系统错误", e);
            return UDataTool.createResult(false, "9999", "服务执行异常");
        }
    }
}
